 #include "Date.h"

bool Date::CheckDate()
{
	if (_month < 1 || _month > 12
		|| _day < 1 || _day > GetMonthDay(_year, _month))
	{
		return false;
	}

	else return true;
}

Date::Date(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;

	if (!CheckDate())
	{
		cout << "日期非法" << endl;
	}
}

//void Date:: Print()
//{
//	cout << _year << "-" << _month << "-" << _day << endl;
//}

void Date::Print() const  //const修饰*this，本质改变了this的类型
{
	cout << _year << "-" << _month << "-" << _day << endl;
}



// ———————————————————————————— 两个Date 的比较
// 写一个小于 和 等于，其他的全部复用
// d1 < d2
bool Date::operator<(const Date& d) const
{
	if (_year < d._year) return true;
	else if (_year == d._year) 
	{
		if (_month < d._month) return true;
		else if (_month == d._month) return _day < d._day;
	}
	return false;
}

// d1 <= d2
bool Date:: operator<=(const Date& d)const
{
	return *this < d || *this == d; //因为我们对小于 和 等于进行了构造
}

bool Date:: operator>(const Date& d)const
{
	return!(*this <= d);
}

bool Date:: operator>=(const Date& d)const
{
	return !(*this < d);
}
bool Date:: operator==(const Date& d)const
{
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}

bool Date:: operator!=(const Date& d)const
{
	return !(*this == d);
}


// ———————————————————— Date 加减天数值

// d1 += 50
Date& Date:: operator+=(int day) 
{
	if (day < 0) return *this -= -day;
	_day += day;
	while (_day >GetMonthDay(_year,_month))
	{
		_day -= GetMonthDay(_year, _month);
		++_month;

		if (_month == 13)
		{
			++_year;
			_month = 1;
		}
	}
	return *this;
}

Date Date:: operator+(int day) const//复用 +=
{
	Date tmp = *this;
	tmp += day; //复用

	return tmp;
}


//// d1 + 50
//Date Date:: operator+(int day) 
//{
//	Date tmp = *this;
//	tmp._day += day;
//	while (tmp._day >GetMonthDay(tmp._year,tmp._month))
//	{
//		tmp._day -= GetMonthDay(tmp._year, tmp._month);
//		++tmp._month;
//		if (tmp._month == 13)
//		{
//			++tmp._year;
//			tmp._month = 1;
//		}
//
//	}
//	return tmp;
//}
//
//
//Date& Date:: operator+=(int day) //复用 +
//{
//    *this = *this + day;
//
//	return *this;
//}



Date& Date:: operator-=(int day)
{
	_day -= day;
	while (_day <= 0)
	{
		--_month;
		if (_month == 0)
		{
			_month = 12;
			_year--;
		}
		_day += GetMonthDay(_year, _month);
	}
	return *this;
}

Date Date:: operator-(int day) const
{
	Date tmp = *this;
	tmp -= day; //复用
	return tmp;
}

// —————————————— 自置++ --

// ++d1
Date& Date:: operator ++()
{
	*this += 1;
	return *this;
}

// ++d1
Date Date:: operator++(int i)
{
	cout << i << endl;
	Date tmp(*this);
	*this += 1;
	return tmp;
}


//// 两个交换 不会报错 打印也没有问题
//// ++d1
//Date Date:: operator ++()
//{
//	Date tmp(*this);
//	*this += 1;
//	return tmp;
//}
//
//// d1++
//Date& Date:: operator++(int i)
//{
//	*this += 1;
//	return *this;
//}


Date& Date:: operator --()
{
	*this -= 1;
	return *this;
}

Date Date:: operator --(int)
{
	Date tmp = *this;
	*this -= 1;
	return tmp;
}

// —————————————————— int 返回

int Date::operator-(const Date& d) const // d1 - d2
{
	Date max = *this; //d1
	Date min = d; //d2;
	int flag = 1;
	if (*this < d)
	{
		max = d;
		min = *this;
		flag = -1;
	}

	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}

	return n * flag;
}


// ———————————————— 输入输出流

//d1 << cout;
//operator<< 想重载为成员函数，可以，但是用起来不符合正常逻辑，不建议这样处理，建议重载为全局函数
void Date::operator << (ostream & out) 
{
	out << _year << "年" << _month << "月" << _day << "日" << endl;
}

ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << "年" << d._month<< "月" << d._day << "日" << endl;
	return out;
}

istream& operator>>(istream& in, Date& d) //流提取
{
	cout << "请依次输入年月日：>";
	in >> d._year >> d._month >> d._day;

	if (!d.CheckDate())
	{
		cout << "日期非法" << endl;
	}

	return in;
}


// —————————————————————— 代码检测

void TestDate1()
{
	Date d1(2024, 4, 14);
	Date d2 = d1 + 5000;
	d1.Print();
	d2.Print();

	cout << endl;

	Date d3(2024, 4, 14);
	Date d4 = d3 - 5000;

	d3.Print();
	d4.Print();

	Date d5(2024, 4, 14);
	d5 += -5000;
	d5.Print();
}


void TestDate2()
{
	Date d1(2024, 4, 14);

	cout << "++d1" << endl;
	Date d2 = ++d1;
	d1.Print();
	d2.Print();

	cout << endl;

	cout << "d1++" << endl;
	Date d3 = d1++;
	d1.Print();
	d3.Print();

	d1.operator++(1);
	d1.Print();;

}


void TestDate3()
{
	Date d1(20224, 4, 14);
	Date d2 = --d1;
	d1.Print();
	d2.Print();

	cout << endl;

	Date d3 = d1--;
	d1.Print();
	d3.Print();

}

void TestDate4()
{
	Date d1(2024, 4, 14);
	Date d2(2024, 5, 1);

	cout << d1 - d2 << endl;
}

void TestDate5()
{
	Date d1(2024, 4, 14);
	Date d2 = d1 + 5000;
	
	//printf("%d", d1); //printf和scanf只支持内置类型
	
	d1.operator<<(cout); //显式写出
	d1 << cout; //这样写才会转换，原因是运算符重载：参数顺序和操作数顺序一致

	////重载为全局就更方便允许
	//cout << d1;
	//cout << d2;

	//cin >> d1 >> d2;
	//cout << d1 << d2;
}


void TestDate6()
{
	const Date d1(2024, 4, 14); //const只可读
	d1.Print(); //权限放大

	d1 + 100;

	Date d2(2024, 4, 25);
	d2.Print(); //权限缩小，也可以用const的函数

	d1 < d2;  //因此为了解决，我们在每个函数加const
	d2 < d1;
}


int main()
{
	TestDate5();

	return 0;
}


